package ninth;
//多线程
public class Note {
}
/**
 * 进程与线程
 * 进程是程序的一次动态执行过程。他经历了从代码加载、执行到执行完毕的一个完整过程。
 * 这个过程也是进程本身从产生、发展到最终消亡的过程。
 * 多进程操作系统能同时运行多个进程（程序），而由于CPU具备分时机制，所以每个进程都循环获得自己的CPU时间片。
 * 由于CPU执行速度非常快，使得所有程序好像是在”同时“运行一样。
 * 多线程是实现并发机制的一种有效手段。进程和线程一样，都是实现并发的一个基本单位。
 * 线程是比进程更小的执行单位，是在进程的基础上进行的进一步划分。
 * 多线程是指一个进程在执行过程中可以产生多个更小的程序单元（即线程），这些线程可以同时存在、同时运行，
 * 而一个进程可能包含了多个同时执行的线程。
 *
 * 通过word的使用了解进程与线程的区别：
 * 在使用Word中 如果出现了单词拼写错误，则Word会在出错的单词下面画出红色的波浪线。
 * 实际上，每次启动一个Word文档对于操作系统而言就相当于启动了一个系统进程，而在这个进程之上又有许多其他程序在运行（比如拼写检查），
 * 那么这些就是一个个的线程。如果Word文档被关闭了，则这些拼写检查的线程肯定也会消失，但是并不一定会让word的进程消失。
 *
 * 在传统的程序语言中，运行的顺序总是必须顺着程序的流程走，遇到if..else语句就加以判断，遇到for while等循环语句就会多绕几个圈，
 * 最后程序还是按着一定的程序走，且一次只能运行一个程序块。
 * Java的多线程打破了这种束缚。所谓的线程（Thread）是指程序的运行流程，多线程的机制则是指可以同时运行多个程序块，使程序运行的效率更高，
 * 也可克服传统程序语言所无法解决的问题。比如，有些包含循环的线程可能要使用比较长的一段时间来运算，此时便可以让另一个线程来做其他的处理。
 *
 * Java中线程的实现
 * Java中实现多线程代码的方式有两种：一种是继承Thread类，另一种是实现Runnable接口（JDK1.5之后提供有一个新的Callable接口）。
 *
 * 使用Runnblae接口实现的多线程可以避免单继承局限，但是Runnable接口实现的多线程会出现Runnable接口中的run()方法不能返回操作结果的问题
 * 为了解决这样的问题，从JDK1.5之后开始对于多线程的实现提供了一个新的接口：java.util.concurrent.Callable
 * 此接口定义如下
 * public interface Callable<V>{
 *     public V call() throws Exception;
 * }
 *  在call()方法上可以实现线程操作数据的返回，返回的数据类型由Callable接口上的泛型类型动态决定
 *
 *  线程的状态
 *  线程有五种状态：创建 就绪 运行 阻塞 终止
 *  创建：Thread thread = new Thread();
 *  就绪：调用start() 启动线程 线程进入就绪状态 线程进入线程队列排队 等待CPU服务
 *  运行：调用run()  当就绪状态的线程被调用并获得处理器资源时，线程就进入了运行状态。 run()定义了该线程的操作和功能
 *  堵塞：一个正在执行的线程在某些特殊情况下，如果被人为挂起或者需要执行耗时的输入输出操作时，会让出CPU并暂停终止自己的执行
 *       进入堵塞状态。堵塞时，县城不能进入排队队列，只有当引起阻塞的原因被消除后，线程才可以转入就绪状态。
 *  死亡：线程调用stop()或者run()方法执行结束后，即处于死亡状态。处于死亡状态的线程不具有继续运行的能力
 *
 *  Thread线程操作的主要方法
 *  public Thread(Runnable target)   //接收Runnable接口子类对象 实例化Thread对象
 *  public Thread (Runnable target,String name)   //接收Runnable接口子类对象 实例化Thread对象，并设置线程名称
 *  public Thread(String name)  //实例化Thread对象，并设置线程名称
 *  public static Thread currentTHread()    //返回目前正在执行的线程
 *  public final String getName()   //返回线程的名称
 *  public final int getPriority    //发挥线程的优先级
 *  public boolean isInterrupted()  //判断目前线程是否被中断，如果是：返回true,否则返回false
 *  public final boolean isAlive()  //判断线程是否在活动，是就返回true 否则返回false
 *  Public final void join() throws InterruptedException    //等待线程死亡
 *  public final synchronized void join(long millis) throws InterruptedException   //等待毫秒之后，线程死亡
 *  public void run()   //执行线程
 *  public final void setName(String name)  //设定线程名称
 *  public final void setPriority(int newPriority)  //设定线程优先级
 *  public static void sleep(long millis) throws InterruptedException   //使目前正在执行的线程休眠millis毫秒
 *  public void start() //开始执行线程
 *  pulic String toString() //返回代表线程的字符串
 *  public static void yield()  //将目前正在执行的线程暂停，允许其他线程执行
 *  public final void setDaemon(boolean on) //将一个线程设置成后台运行
 *
 *
 *  同步与死锁
 *  一个多线程的程序 如果是通过Runnable接口实现的，则意味着类中的属性将被多个线程共享。
 *  因此，如果这多个线程要操作同一资源时，就有可能出现资源的同步问题。
 *  比如前面的卖票程序，如果多个线程同时操作时，就有可能出现卖出的票数为负数的问题
 *
 *  使用同步解决问题
 *  解决资源共享的同步操作 可以用同步代码块和同步方法两种方式完成
 *
 *  Java中方法定义的完整格式
 *  访问权限{public|default|protected|private} [final] [static] [synchronized]
 *  返回类型|void  方法名称(参数类型 参数名称,...) [throws Exception1,Exception2]{
 *         [return [返回值|返回调用处] ];
 *  }
 *
 *  死锁
 *  指两个线程都在等待彼此先完成，造成了程序的停滞状态。一般程序的死锁实在程序运行时候出现的。
 *
 *  线程的生命周期
 *  新的线程  -stop-> 销毁
 *  新的线程  -start-> 运行(yield)  -stop或者run()结束-> 销毁
 *  新的线程  -start-> 运行  -suspend sleep wait (resume)-> 暂停  -stop-> 销毁
 *  三个新方法：
 *  suspend():暂时挂起线程
 *  resume():恢复挂起的线程
 *  stop():停止线程
 *  但是 对于线程subpend(),resume(),stop()三种方法并不推荐使用，因为这三种方法在操作的时候会产生死锁的问题
 *
 *  注意subpend(),resume(),stop()方法使用了@Deprecated声明
 *  这属于Annotation语法，表示此操作不建议使用。
 *  所以一旦使用这些方法之后将会出现警告信息。
 *
 *  泛型
 *  再开发中对象的引用传递很常见，但是如果在泛型类中，在进行引用传递的泛型类型必须才可以传递，否则是无法传递的。
 *
 *
 *
 *
 *
 */